/*
Copyright (C) 2008 raohmaru <http://www.raohmaru.com>

This file is part of Raohmaru AS3 Framework.

Raohmaru AS3 Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Raohmaru AS3 Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Raohmaru AS3 Framework.  If not, see <http://www.gnu.org/licenses/>.
*/

package jp.raohmaru.controls 
{

import jp.raohmaru.effects.ColorModifier;

import flash.display.MovieClip;
import flash.events.EventDispatcher;
import flash.events.MouseEvent;

/**
 * Se distribuye cuando el usuario pulsa sobre una instancia de Control.
 * @eventType flash.events.MouseEvent.MOUSE_DOWN
 */
[Event(name="mouseDown", type="flash.events.MouseEvent") ]

/**
 * Se distribuye cuando el usuario suelta el botón sobre una instancia de Control.
 * @eventType flash.events.MouseEvent.MOUSE_UP
 */
[Event(name="mouseUp", type="flash.events.MouseEvent") ]

/**
 * Se distribuye cuando el usuario pasa el cursor por encima de una instancia de Control.
 * @eventType flash.events.MouseEvent.MOUSE_OVER
 */
[Event(name="mouseOver", type="flash.events.MouseEvent") ]

/**
 * Se distribuye cuando el usuario mueve el cursor hacia el exterior de una instancia de Control.
 * @eventType flash.events.MouseEvent.MOUSE_OUT 
 */
[Event(name="mouseOut", type="flash.events.MouseEvent") ]


/**
 * La clase Control es la clase base para todos los controles.
 * @author raohmaru
 * @version 1.0.2
 */
public class Control extends EventDispatcher 
{
	/**
	 * @private
	 */
	protected var	_movie : MovieClip,
					_enabled : Boolean = true,
					_color_mod :ColorModifier;

	/**
	* Un valor booleano que especifica si está activado un control. Cuando un control está desactivado, el control está visible pero no responde a los
	* eventos de ratón.
	* @default true
	*/
	public function get enabled() : Boolean
	{
		return _enabled;
	}	
	public function set enabled(value : Boolean) : void
	{
		_enabled = value;
		_movie.enabled = value;
		_movie.mouseEnabled = value;
		_movie.mouseChildren = value;
		
		if(value)
		{
			if(_color_mod) _color_mod.restore();
		}
		else
		{
			if(!_color_mod) _color_mod = new ColorModifier(_movie);
			_color_mod.toGrayscale(value ? 0 : 1);
		}
	}
	
	/**
	* Indica si el control es visible.
	*/
	public function get visible() : Boolean
	{
		return _movie.visible;
	}	
	public function set visible(value : Boolean) : void
	{
		_movie.visible = value;
	}
	
	/**
	 * Define o obtiene la altura del control.
	 */
	public function get height() : Number
	{
		return _movie.height;
	}
	public function set height(value : Number) : void
	{
		_movie.height = value;
	}
	
	/**
	 * Define o obtiene la anchura de la barra del control.
	 */
	public function get width() : Number
	{
		return _movie.width;
	}
	public function set width(value : Number) : void
	{
		_movie.width = value;
	}
	
	/**
	 * Define el nombre del control. Por defecto, este es el nombre del MovieClip que representa en el escenario.
	 */
	public function get name() : String
	{
		return _movie.name;
	}
	public function set name(value : String) : void
	{
		_movie.name = value;
	}

	/**
	 * Indica la coordenada <i>x</i> de la instancia de Control en relación a las coordenadas locales del DisplayObjectContainer principal.
	 * @see flash.display.DisplayObject#x
	 */
	public function get x() : Number
	{
		return _movie.x;
	}	
	public function set x(value : Number) : void
	{
		_movie.x = value;
	}
	
	/**
	 * Indica la coordenada <i>y</i> de la instancia de Control en relación a las coordenadas locales del DisplayObjectContainer principal.
	 * @see flash.display.DisplayObject#y
	 */
	public function get y() : Number
	{
		return _movie.y;
	}	
	public function set y(value : Number) : void
	{
		_movie.y = value;
	}

	/**
	 * Indica el valor de transparencia alfa del control.
	 */
	public function get alpha() : Number
	{
		return _movie.alpha;
	}
	public function set alpha(value : Number) : void
	{
		_movie.alpha = value;
	}
	
	/**
	 * Obtiene el clip de película asociado al control.
	 */
	public function get movie() :MovieClip
	{
		return _movie;
	}
	
	
	/**
	 * Crea una nueva instancia del objeto Control.
	 * @param movie Objeto MovieClip que es la representación gráfica del control
	 */
	public function Control(movie : MovieClip)
	{
		_movie = movie;
		
		init();
	}
	
	/**
	 * @private
	 */
	protected function init() : void
	{
		_movie.buttonMode = true;
		_movie.mouseChildren = false;
		
		_movie.addEventListener(MouseEvent.MOUSE_DOWN, pressHandler);
		_movie.addEventListener(MouseEvent.MOUSE_UP, pressHandler);
		_movie.addEventListener(MouseEvent.MOUSE_OVER, overHandler);
		_movie.addEventListener(MouseEvent.MOUSE_OUT, overHandler);
	}
	
	/**
	 * @private
	 */
	protected function pressHandler(e : MouseEvent) : void
	{		
		dispatchEvent(e);
	}
	
	/**
	 * @private
	 */
	protected function overHandler(e : MouseEvent) : void
	{		
		dispatchEvent(e);
	}
}
}
